package ukoly;


import database.DatabazovaChyba;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import system.Launcher;
import uzivatele.Uzivatel;

/** 
 * Vetsina interakce (vcetne odkazu) s ukoly by mela probihat pres tuto tridu. 
 * View obstarava user interface, Control funkcnost.
 * Kdyz se vytvari seznamy apod, mel by se vytvaret seznam Controlu, ne Modelu.
 * 
 * Uznavam, ten navrh co je ted neni efektivni - kazdy Model ma svuj Control, ktery
 * dava jen metody navic a navic ma getModel, takze by se ty metody daly prekopirovat
 * do modelu, ale uz je moc pozde na tak velky zmeny bez obrovskyho mnozstvi prace
 * 
 * @author Pavel Lieberzeit
 */
public class UkolControl {
    
    
    private UkolModel ukol;
    
    
    
    /**
     * Konstruktor, ktery zaroven vytvori UkolModel, ktery spravuje. Pro inicializaci z databaze.
     * @param ID
     * @param jmeno
     * @param popis
     * @param deadline
     */
    public UkolControl(int ID, String jmeno, String popis, GregorianCalendar casStart, GregorianCalendar casKonec,
            GregorianCalendar deadline, ProjektControl projekt, Uzivatel vlastnik, UkolStatus status, ArrayList<Komentar> komentare,
            int casStraven) {
        
        this.ukol = new UkolModel(ID, jmeno, popis, casStart, casKonec, deadline, projekt, vlastnik, status,
                komentare, casStraven);

    }
    
    public UkolControl(UkolModel ukol) {
        this.ukol = ukol;
    }

    
    
    /**
     * edituje UkolModel, ktery tenhle Control spravuje. User interface by mel dodat vsechny hodnoty,
     * at uz novy, nebo ty, co tam byly. Zaroven by je mel preprocessovat.
     * @param jmeno
     * @param popis
     * @param deadline
     * @param projekt
     * @param vlastnik
     * @param status
     * @param casStraven 
     */
    public void editUkol(String jmeno, String popis, GregorianCalendar deadline,
            ProjektControl projekt, Uzivatel vlastnik, UkolStatus status, int casStraven) throws DatabazovaChyba {
        
        this.ukol.setJmeno(jmeno);
        this.ukol.setPopis(popis);
        this.ukol.setCasDead(deadline);
        this.ukol.setProjekt(projekt);
        this.ukol.setVlastnik(vlastnik);
        
        if(checkStatusComplete(status)) {
            this.ukol.setCasKonec(new GregorianCalendar());
            this.ukol.getCasKonec().setTime(new Date(System.currentTimeMillis()));
        } else if (checkStatusIncomplete(status)) {
            this.ukol.setCasKonec(null);
        }
        
        this.ukol.setStatus(status);
        
        this.ukol.setCasStraven(casStraven);
        
        Launcher.getInstance().getDatabase().ulozUkol(this);
        
    }
    
    /*
     * Zkontroluje, jestli se nezmenil stav ukolu z rozpracovanyho na dokonceny/potvrzeny
     */
    private boolean checkStatusComplete(UkolStatus status) {
        if((this.ukol.getStatus() != UkolStatus.CONFIRMED && this.ukol.getStatus() != UkolStatus.COMPLETE) &&
                 (status == UkolStatus.CONFIRMED || status == UkolStatus.COMPLETE))
            return true;
        return false;
    }
    
    /*
     * Zkontroluje, jestli se nezmenil stav ukolu z dokoncenyho/potvrzenyho na rozpracovany
     */
    private boolean checkStatusIncomplete(UkolStatus status) {
        if((this.ukol.getStatus() == UkolStatus.CONFIRMED || this.ukol.getStatus() == UkolStatus.COMPLETE) &&
                 (status != UkolStatus.CONFIRMED && status != UkolStatus.COMPLETE))
            return true;
        return false;
    }
    
    public void addKomentar(String text, Uzivatel uzivatel) throws DatabazovaChyba {
        GregorianCalendar temp = new GregorianCalendar();
        temp.setTime(new Date(System.currentTimeMillis()));
        
        Komentar koment = Launcher.getInstance().getDatabase().vytvorKomentar(new Komentar(text, uzivatel, -1, temp, this));  
   
        this.ukol.getKomentare().add(koment);
        
    }
    
    /**
     * vymaze ukol z databaze
     */
    public void deleteUkol() throws DatabazovaChyba{
        
        Launcher.getInstance().getDatabase().smazUkol(this);
        
//        this.ukol = null;        
    }
    
    
    
    /**
     * vytvori novy ukol a ulozi ho v databazi. Volano z GUI - to rozpozna, jestli 
     * jde o novy ukol nebo edit. Hodnoty musi byt preprocessovany.
     * @param ID
     * @param jmeno
     * @param popis
     * @param deadline
     * @param projekt
     * @param vlastnik
     * @param status 
     */
    public static UkolControl createUkol(int ID, String jmeno, String popis, GregorianCalendar deadline, ProjektControl projekt,
            Uzivatel vlastnik, UkolStatus status, int casStraven) throws DatabazovaChyba {
        
        UkolModel ukol = new UkolModel(ID, jmeno, popis, deadline, projekt, vlastnik, status, casStraven);
        
        if(status == UkolStatus.COMPLETE || status == UkolStatus.CONFIRMED){
            ukol.setCasKonec(new GregorianCalendar());
            ukol.getCasKonec().setTime(new Date(System.currentTimeMillis()));
        }
        
        
        
        return Launcher.getInstance().getDatabase().vytvorUkol(new UkolControl(ukol));
        
    }
    
   
    
    public UkolModel getModel() {
        return this.ukol;
    }
    
    
// Tyto metody jsou potencialne zneuzitelne, ale nechavam je tu zakomentovany pro 
// pripad potreby. Tyhle veci by si mel obstaravat UkolView...
//    
//    public GregorianCalendar getCasDead() {
//        return this.ukol.getCasDead();
//    }
//
//    public int getCasStraven() {
//        return this.ukol.getCasStraven();
//    }
//
//    public String getJmeno() {
//        return this.ukol.getJmeno();
//    }
//
//    public String getPopis() {
//        return this.ukol.getPopis();
//    }
//
//   
//    public Projekt getProjekt() {
//        return this.ukol.getProjekt();
//    }
//
//    
//    public Uzivatel getVlastnik() {
//        return this.ukol.getVlastnik();
//    }
//
//    public UkolStatus getStatus() {
//        return this.ukol.getStatus();
//    }
//
//    public int getID() {
//        return this.ukol.getID();
//    }
//
//    public GregorianCalendar getCasKonec() {
//        return this.ukol.getCasKonec();
//    }
//
//    public GregorianCalendar getCasStart() {
//        return this.ukol.getCasStart();
//    }
//
//    
//    public ArrayList getKomentare() {
//        return this.ukol.getKomentare();
//    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final UkolControl other = (UkolControl) obj;
        if (this.ukol != other.ukol && (this.ukol == null || !this.ukol.equals(other.ukol))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 59 * hash + (this.ukol != null ? this.ukol.hashCode() : 0);
        return hash;
    }
    
    
    
}
